/* 
 * File:   Vocabluary.h
 * Author: vicror
 *
 * Created on October 24, 2011, 12:54 AM
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files
 * (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge,
 * publish, distribute, sublicense, and/or sell copies of the Software,
 * and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef VOCABLUARY_H
#define	VOCABLUARY_H



#include "Base_SearchEnginer.h"
#include "basetype.h"

namespace SearchEnginer {
    typedef std::vector<Base_SearchEnginer *> ListSearchEnginer;
    typedef ListSearchEnginer::iterator ListSearchEnginerItr;

    class Vocabluary {
    public:
        /**
         * @brieef Подлючение поискового движка к словарю.
         * @param orig - поисковый движок
         * @return Нет выходных параметров
         */
        void link(Base_SearchEnginer& orig);

        /**
         * @brief Иницилизирует новый словарь.
         * @param orig - поисковый движок
         * @return Возврашает указатель на словарь
         *
         * Если поисковый движок был зарегистрирован в другом словаре, ссылка в
         * другом словаре уничтожается и словарь поискового движка очишается.
         */
        static Vocabluary * Init(Base_SearchEnginer& orig);

        /**
         * @brief Удаляет ссылку на поисковый движок из словаря.
         * @param orig - поисковый движок.
         * @return Нет возврашаемого значения
         *
         * Удаляет ссылку на поисковый движок из словаря. Если словарь остался
         * без поисковых движков, словарь уничтожается.
         */
        void unlink(Base_SearchEnginer& orig);

        /**
         * @brief Добваляет слово в словарь
         * @param orig - слово
         * @return Если слово было добавлено, возврашает true иначе false.
         */
        bool append(const string& orig);

        /**
         * @brief Добавляем слова из словаря источника в словарь
         * @param orig - словарь источник.
         * @return Возврашает true, если хоть одно слово было добавлено.
         * Иначе false.
         */
        bool append(const Vocabluary& orig);

        /**
         * @brief Возврашает массив индексов, которому соответствует слово
         * @param orig - поисковое слово
         * @return Массив индексов.
         */
        ListIndex hasWordByIndex(const string& orig);

        /**
         * @brief Возврашает список слов, которые соответсвуют индексам
         * @param orig - Список индексов.
         * @return Список слов
         */
        ListString getWords(const ListIndex& orig) const;

        /**
         * @brief Возврашает список всех слов в словаре.
         * @param Нет параметров.
         * @return Список слов.
         */
        ListString getWords(void) const;

        /**
         * @brief Возврашает количество слов в словаре
         * @param Нет входных параметор
         * @return Количество слов в словаре
         */

        unsigned int size(void) const;

        /**
         * @brief Выводит в поток содержимое словаря.
         * @param out - поток ввывода.
         * @param orig - словарь.
         * @return возврашает поток ввывода.
         *
         * Выводит в поток содержимое словаря. Файл словаря предваряется меткой
         * SearchEnginerVer1.0
         */
        friend std::ostream& operator<< (std::ostream& out, const Vocabluary &orig);

        /**
         * @brief Загружает из потока словарь.
         * @param out - поток ввода.
         * @param orig - словарь.
         * @return Возврашает поток ввода.
         *
         * Загружает из потока словарь. Передача должна предварятся меткой
         * SearchEnginerVer1.0. Словарь перед загрузкой не очишается. Т.е.
         * каждая загрузка дополняет словарь.
         */
        friend std::istream& operator>> (std::istream& is, Vocabluary& orig);





    private:
        Vocabluary();
        Vocabluary(const Vocabluary& orig);
        virtual ~Vocabluary();
        /**
         * @brief Проверяет словарь, содержит ли он Поисковую машину
         * @param orig - ссылка на поисковую машину
         * @return Возврашает индекс, для поисковой машины. Если она не
         * найдена, возврашает -1.
         */
        int hasSearchEnginer(const Base_SearchEnginer& orig) const;

        /**
         * @brief Удаляет ссылку поискового движка из словаря.
         * @param orig - поисковый движок
         * @return Если ссылка была удалена, возврашает true иначе false
         */
        bool removeSearchEnginer(Base_SearchEnginer& orig);

        /**
         * @brief Удаляет словарь из списка словарей.
         * @param orig - Словарь
         * @return Нет возврашаемого значения
         *
         * Удаляет словарь из списка словарей, при условии, что в нем
         * не зарегистрированы ни один поисковый движок.
         */
        static void removeVocabluary(Vocabluary& orig);



        ListSearchEnginer listSE;

        static std::vector<Vocabluary * > listVoc;

        ListString vocabluary;

    };
}
#endif	/* VOCABLUARY_H */

